/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modele.realisateur;

import java.util.ArrayList;
import java.util.List;
import modele.De;
import modele.ModeleYams;
import modele.ModeleYamsInterface;
import modele.combinaison.Multiple;

/**
 * Classe RealisateurMultiple : Essaye de réaliser les combinaison Multiples.
 * Le fonctionnement est le meme pour tout les Multiple, seul le nombre de
 * dé varie.
 * @author Florian MININ & Khémon BEH
 */
public class RealisateurMultiple extends RealisateurCombinaisonComplexe{

    /**
     * Attributs
     */
    List<Integer> valeurs;
    int valMax;
    int nbVal;
    Multiple combinaison;

    /**
     * Constructeur
     * @param combinaison Combinaison a réaliser
     * @param modele Modèle du yams
     */
    public RealisateurMultiple(Multiple combinaison,ModeleYamsInterface modele){
        super(modele);
        this.combinaison = combinaison;

        //Initialisation du tableau de valeur
        valeurs = new ArrayList();
        for (int i = 0; i < 6; i++) {
            valeurs.add(0);
        }

        //Pour commencer on intialise la valeur du dé ayant le plus
        //d'occurrences a 1.
        valMax = 1;
    }

    /**
     * Réalise la combinaison
     */
    @Override
    public void realiseCombinaison() {
        boolean fin = false;
        //Tant qu'il reste des lancers
        while (modele.getNbLanceDesRestant() > 0) {
            //On jette les des
            modele.jetteDes();
            List<De> ensembleDes = modele.getDes();

            //1er parcours : On récupère le nombre de dés
            //sorti pour chaque valeur
            for (De d : ensembleDes) {
                //On déselectionne l'ensemble des dés
                modele.deSelectionneDe(d);
                int valPrecedente = valeurs.get(d.getValeur() - 1);
                valeurs.set(d.getValeur() - 1, valPrecedente + 1);
            }

            int valeur = 1;
            //2ème parcours : On récupère la valeur maximale
            for (int i : valeurs) {
                //On privilégie les brelans avec des valeurs
                //élevées afin d'améliorer le score.
                if (i >= valeurs.get(valMax - 1)) {
                    valMax = valeur;
                }
                valeur++;
            }

            valeurs.clear();
            for (int i = 0; i < 6; i++) {
                valeurs.add(0);
            }

            nbVal = 0;
            //3ème parcours : On selectionne les dés dont la valeur
            //est égale a val max si celle ci est différente de 1
            for (int i = 0; i < 5; i++) {
                if (modele.getValeurDes(i) == valMax) {
                    modele.selectDe(i + 1);
                    nbVal++;
                    if (nbVal == combinaison.nbDes()) {
                        fin = true;
                        break;
                    }
                }
            }

            //Si on a le multiple souhaité, on sort.
            if (fin) {
                break;
            }
        }
    }

}
